/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;


import fisica.CapaFisica;
import hibernate.objeto.FichaMortalidad;
import hibernate.objeto.Paciente;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Date;
import presentacion.CapaPresentacion;

/**
 *
 * @author Gonzalo
 */
public class FichaMortalidadLogica extends CapaLogica {

    /**
     * Crea y persiste la ficha de mortalidad para el paciente.
     *
     * @param datosFichaMortalidad Los datos correspondientes a la ficha
     * @param paciente El paciente a quien se le carga la ficha
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarFichaMortalidad(
            Object[] datosFichaMortalidad, Paciente paciente) {

        FichaMortalidad fichaMortalidad = paciente.getFichaMortalidad();
        //Si es una modificacion
        if (fichaMortalidad != null) {
            //Escribe el log
            backUpModificacion(fichaMortalidad);
        }
        
        //Crea el objeto
        fichaMortalidad = crearUObtenerObjetoFichaMortalidad(
                datosFichaMortalidad, fichaMortalidad);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(fichaMortalidad)) {
            paciente.setFichaMortalidad(fichaMortalidad);
            if (CapaFisica.guardarOActualizarObjeto(paciente)) {
                return true;
            } else {
                return false;
            }
        } else {
            return false;
        }
    }

    /**
     * Crea un objeto ficha de mortalidad con los datos pasados por parámetro.
     *
     * @param datosFichaMortalidad Los datos a cargar
     * @param fichaMortalidad La ficha de mortalidad que se está agregando/
     * modificando
     * @param paciente El paciente a quien se le carga la ficha
     * @return El objeto FichaMortalidad creado
     */
    private static FichaMortalidad crearUObtenerObjetoFichaMortalidad(
            Object[] datosFichaMortalidad, FichaMortalidad fichaMortalidad){

        if (fichaMortalidad == null) {
             fichaMortalidad = new FichaMortalidad();
        }

        fichaMortalidad.setFechaFichaMortalidad(new Date());
        
        fichaMortalidad.setHoraDeMuerteFichaMortalidad(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_HORA_DE_MUERTE].toString());

        fichaMortalidad.setFechaDeMuerteFichaMortalidad(
                (Date) datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_FECHA_DE_MUERTE]);

        fichaMortalidad.setLugarDeMuerteFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_LUGAR_DE_MUERTE].
                toString()));

        fichaMortalidad.setTextoAFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_A].
                toString()));

        fichaMortalidad.setTextoBFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_B].
                toString()));

        fichaMortalidad.setTextoCFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_C].
                toString()));

        fichaMortalidad.setTextoDFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_D].
                toString()));

        fichaMortalidad.setTextoEFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_E].
                toString()));

        fichaMortalidad.setTextoFFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_F].
                toString()));
        
        fichaMortalidad.setTextoGFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_G].
                toString()));
        
        fichaMortalidad.setTextoHFichaMortalidad(eliminarEspaciosMuertos(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_TEXTO_H].
                toString()));
        
        fichaMortalidad.setFormaDeMuerteFichaMortalidad(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_FORMA_DE_MUERTE].toString());
        
        fichaMortalidad.setDonanteFichaMortalidad(
                datosFichaMortalidad[CapaLogica.FICHA_MORTALIDAD_DONANTE].toString());

        return fichaMortalidad;
    }

    /**
     * Escribe un archivo de texto el cual es una imagen del objeto que se
     * ha modificado y sus objetos asociados, guardando el mismo en la tabla.
     *
     * @param fichaMortalidad El objeto a resguardar
     */
    private static void backUpModificacion(FichaMortalidad fichaMortalidad) {
        String rutaLogLocal = DIRECTORIO_DE_TRABAJO + "\\" +
                    FichaMortalidad.class.getName() + ".txt";

        File log = CapaLogica.byteArrayToFile(rutaLogLocal,
                fichaMortalidad.getArchivoLogFichaMortalidad());

        if (log == null) {
            log = new File(rutaLogLocal);
        }

        //Se manipula el log
        escribirLogFichaMortalidad(fichaMortalidad, rutaLogLocal);

        //Se guarda
        byte[] bFile = new byte[(int) log.length()];

        try {
            FileInputStream fileInputStream = new FileInputStream(log);
            //convert file into array of bytes
            fileInputStream.read(bFile);
            fileInputStream.close();
        } catch (Exception exc) {
            System.err.println(exc.getMessage());
        }

        //Setea el adjunto
        fichaMortalidad.setArchivoLogFichaMortalidad(bFile);
        eliminarArchivosTemporales();
    }

    /**
     * Escribe el objeto en un archivo.
     *
     * @param fichaMortalidad El objeto a resguardar
     * @param log El archivo en donde escribir
     * @return true si se escribio correctamente, false en caso contrario
     */
    public static boolean escribirLogFichaMortalidad(FichaMortalidad fichaMortalidad,
            String rutaLog) {
        try {
            //Evolucion
            String fichaMortalidadString = getFichaMortalidadString(fichaMortalidad);

            BufferedWriter bw = new BufferedWriter(new FileWriter(rutaLog, true));
            fichaMortalidadString += "\n" + SEPARADOR + "\n";
            //Escribe los datos del objeto
            bw.write(fichaMortalidadString);

            bw.close();
        } catch (IOException exception) {
            System.err.println(exception.getMessage());
            return false;
        }

        return true;
    }

    /**
     * Retorna todo el objeto FichaMortalidad en string.
     *
     * @param fichaMortalidad El objeto a escribir
     */
    public static String getFichaMortalidadString(FichaMortalidad fichaMortalidad) {
        String fichaMortalidadString =
                "idFichaMortalidad : " +
                fichaMortalidad.getIdFichaMortalidad() + "\n" +
                "fechaFichaMortalidad : " +
                fichaMortalidad.getFechaFichaMortalidad() + "\n" +
                "horaDeMuerteFichaMortalidad : " +
                fichaMortalidad.getHoraDeMuerteFichaMortalidad() + "\n" +
                "fechaDeMuerteFichaMortalidad : " +
                fichaMortalidad.getFechaDeMuerteFichaMortalidad() + "\n" +
                "lugarDeMuerteFichaMortalidad : " +
                fichaMortalidad.getLugarDeMuerteFichaMortalidad() + "\n" +
                "textoAFichaMortalidad : " +
                fichaMortalidad.getTextoAFichaMortalidad() + "\n" +
                "textoBFichaMortalidad : " +
                fichaMortalidad.getTextoBFichaMortalidad() + "\n" +
                "textoCFichaMortalidad : " +
                fichaMortalidad.getTextoCFichaMortalidad() + "\n" +
                "textoDFichaMortalidad : " +
                fichaMortalidad.getTextoDFichaMortalidad() + "\n" +
                "textoEFichaMortalidad : " +
                fichaMortalidad.getTextoEFichaMortalidad() + "\n" +
                "textoFFichaMortalidad : " +
                fichaMortalidad.getTextoFFichaMortalidad() + "\n" +
                "textoGFichaMortalidad : " +
                fichaMortalidad.getTextoGFichaMortalidad() + "\n" +
                "textoHFichaMortalidad : " +
                fichaMortalidad.getTextoHFichaMortalidad() + "\n" +
                "formaDeMuerteFichaMortalidad : " +
                fichaMortalidad.getFormaDeMuerteFichaMortalidad() + "\n" +
                "donanteFichaMortalidad : " +
                fichaMortalidad.getDonanteFichaMortalidad() + "\n" ;
        
        return fichaMortalidadString;
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de la ficha de
     * mortalidad.
     *
     * @param fichaMortalidad La ficha de mortalidad
     * @return El String que contiene el HTML
     */
    public static String getFichaMortalidadHTML(FichaMortalidad fichaMortalidad) {
        String fichaMortalidadHTML = "";
        
        if (fichaMortalidad != null) {
            fichaMortalidadHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">FICHA DE MORTALIDAD</font><br> " +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Fecha de la ficha: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    CapaPresentacion.imprimirFecha(fichaMortalidad.getFechaFichaMortalidad()) + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Fecha de muerte: </font>"
                        + "<font size=\"3\" face=\"arial\">" +
                        CapaPresentacion.imprimirFecha(fichaMortalidad.getFechaDeMuerteFichaMortalidad())  + " - " +
                        fichaMortalidad.getHoraDeMuerteFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Lugar de muerte: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getLugarDeMuerteFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Debido a: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoAFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Debido a: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoBFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Debido a: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoCFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Debido a: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoDFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Debido a: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoEFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Otras condiciones: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoFFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Otras condiciones: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoGFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Otras condiciones: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getTextoHFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Forma de muerte: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getFormaDeMuerteFichaMortalidad() + "</font><br>" +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Donante: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    fichaMortalidad.getDonanteFichaMortalidad() + "</font><br>";
        } else {
            fichaMortalidadHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">FICHA DE MORTALIDAD</font><br> " +
                    "<font size=\"3\" face=\"arial\">No posee</font><br></font>";
        }

        return fichaMortalidadHTML;
    }

}
